const fs = require('fs');
const path = require('path');

function getFileByPath(fpath, callback) {
    fs.readFile(fpath, 'utf-8', (err, dataStr) => {
        if (err) {
            return callback(err)
        } else {
            callback(null, dataStr)
        }
    })
}


//回调嵌套回调，回调地狱

getFileByPath(path.join(__dirname,'./111.txt'),(err,str) => {
    if(err){
        return console.log(err.message)
    }else{
        console.log(str);
        getFileByPath(path.join(__dirname,'./222.txt'),(err,str) => {
            if(err){
                return console.log(err.message)
            }else{
                console.log(str);
                getFileByPath(path.join(__dirname,'./333.txt'),(err,str) => {
                    if(err){
                        return console.log(err.message)
                    }else{
                        console.log(str)
                    }
                });
            }
        });
    }
});

//为了解决回调地狱，引入Promise（）
// 1.Promise 是一个构造函数，可以new一个实例
// 2.两个函数   resolve：成功回调       reject ：失败回调
// 3.Prototype  属性上面有then（）方法，  所以Promise（）创建的实例都可以访问到then（）
// 4.Promise 表示一个异步操作，  每当  我们new一个promise实例，就表示一个异步操作
// 5.因为 promise创建的实例是一个异步操作，所以结果只有两种状态：
//      5.1成功
//      5.2失败
//      5.3内部拿到的结果无法return给调用者，只能使用回调

function getFule(fpath) {
    return new Promise((resolve, reject) => {
        fs.readFile(fpath, 'utf-8', (err, str) => {
            if (err) {
                return reject(err);
            } else {
                resolve(str);
            }
        })
    });

}

getFule('./test/111.txt').then((data) => {
        console.log(data);
        return getFule('./test/222.txt');
    }).then((data) => {
        console.log(data);
        return getFule('./test/333.txt');
    }).then((data) => {
        console.log(data);
    }).catch((err) => {
        console.log(err.message)
});

//promise 异常捕获  每个then（）后面加err捕获，不会终止后面的操作
//在最后面加catch（）有任何失败立即终止所有的操作